package com.song.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class AnimalProxy implements InvocationHandler {
    private String name;

    Animals animals = new Dog();

    public AnimalProxy(String name) {
        this.name = name;
    }

    @SuppressWarnings("unchecked")
    public <T> T getProxy(Class<T> clazz) {
        return (T) Proxy.newProxyInstance(clazz.getClassLoader(), new Class<?>[]{clazz}, this);//实现类dog获取加载器时需要在后面加getClass()  而接口Animals则不需要
    }

    //1. 可以使用反射获取代理对象的信息（也就是proxy.getClass().getName()）。
    //
    //2. 可以将代理对象返回以进行连续调用，这就是proxy存在的目的，因为this并不是代理对象。
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//        System.out.println(proxy.getClass().getName());//jdk.proxy1.$Proxy0  代理类的实例
        System.out.println("Invoke before...");
//        System.out.println(animals.printName(name));

        System.out.println(method.getName());//printName
//        System.out.println(method.invoke(animals, args));//8
        System.out.println(method.invoke(animals, args));//8


//        System.out.println(animals.printName(name));
        System.out.println("Invoke after...");
//        return Proxy.newProxyInstance(proxy.getClass().getClassLoader(), proxy.getClass().getInterfaces(), this);
        return method.invoke(animals, args);//返回值是根据 Method 的 返回值决定的
    }
}
